home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / macros / generic / psbox / psbox.tex < prev    next >
Encoding:
Text File  |  1992-11-17  |  22.0 KB  |  650 lines

  1. %
  2. %       %%%%%%%    %%%%%        %%%%%%    %%%%%   %     %
  3. %       %      %  %             %     %  %     %   %   %
  4. %       %      %  %             %     %  %     %    % %
  5. %       %%%%%%%    %%%%%        %%%%%%   %     %     %
  6. %       %               %       %     %  %     %    % %
  7. %       %               %       %     %  %     %   %   %
  8. %       %         %%%%%%        %%%%%%    %%%%%   %     %
  9. %
  10. %       By Jean Orloff
  11. %       Comments & suggestions by e-mail: ORLOFF@surya11.cern.ch
  12. %       No modification of this file allowed if not e-sent to me.
  13. %
  14. % WHAT IS IT:
  15. % psbox is a set of machine-independent TeX macros to
  16. % 1) allow (Encapsulated) PostScript figure inclusion in all versions
  17. %    of TeX (Plain, LaTeX) on all machines using a PostScript printer
  18. % 2) facilitate the communication (e-mail, ftp, ...) of all the files
  19. %    (text, macros, figs) needed to reproduce a TeX document by grouping
  20. %    them together into a single, TeXable file.
  21. % For more info, get the file pub/TeX/psbox/PSBOXALL.TEX by anonymous
  22. %     ftp from cs.nyu.edu(=128.122.140.24)
  23. %
  24. % History:
  25. %  1.34  \readfilename=final fix for all filename scans; try \psforptips
  26. %  1.33: corrects \psnewinput for LaTeX (still fails if fname=a{b}c)
  27. %  1.32: corrects \psfordvialw and adds .TEX to PSBOXALL(!)
  28. %  1.31: adds \psfordvialw(?)
  29. %  1.30: adds \splitfile & \joinfiles for multi-file management
  30. %  1.24: fix error handling & add \psonlyboxes
  31. %  1.22: makes \drawingBox \global for use in Phyzzx
  32. %  1.21: accepts %%BoundingBox: (atend)
  33. %  1.20: tries to add \psfordvitps for the TeXPS package.
  34. %  1.10: adds \psforoztex, error handling...
  35. %2345678 1 2345678 2 2345678 3 2345678 4 2345678 5 2345678 6 2345678 7 23456789
  36. %
  37. % Checking version no to avoid multiple loadings
  38. \def\temp{1.34}%
  39. \let\tempp=\relax
  40. \expandafter\ifx\csname psboxversion\endcsname\relax
  41.   \message{PSBOX(\temp) loading}%
  42. \else
  43.     \ifdim\temp cm>\psboxversion cm
  44.       \message{PSBOX(\temp) loading}%
  45.     \else
  46.       \message{PSBOX(\psboxversion) is already loaded: I won't load
  47.         PSBOX(\temp)!}%
  48.       \let\temp=\psboxversion
  49.       \let\tempp=\endinput
  50.     \fi
  51. \fi
  52. \tempp
  53. \let\psboxversion=\temp
  54. \catcode`\@=11
  55. % Every macro likes a little privacy...
  56. %
  57. %Trying to tame the variety of \special commands for Postscript: the
  58. %  universal internal command \PSspeci@l##1##2 takes ##1 to be the
  59. %  filename and ##2 to be the integer scale factor*1000 (as for usual
  60. %   TeX \scale commands)
  61. %
  62. \def\psfortextures{%     For TeXtures on the Macintosh
  63. %-----------------
  64. \def\PSspeci@l##1##2{%
  65. \special{illustration ##1\space scaled ##2}%
  66. }}%
  67. \def\psfordvitops{%      For the DVItoPS converter on IBM mainframes
  68. %----------------
  69. \def\PSspeci@l##1##2{%
  70. \special{dvitops: import ##1\space \the\drawingwd \the\drawinght}%
  71. }}%
  72. \def\psfordvips{%      For DVIPS converter on VAX, UNIX and PC's
  73. %--------------
  74. \def\PSspeci@l##1##2{%
  75. %    \special{/@scaleunit 1000 def}% never read dox without trying!
  76. \d@my=0.1bp \d@mx=\drawingwd \divide\d@mx by\d@my% BUG! for large \drawingwd
  77. \special{PSfile=##1\space llx=\psllx\space lly=\pslly\space%
  78. urx=\psurx\space ury=\psury\space rwi=\number\d@mx
  79. }}}%
  80. \def\psforoztex{%        For the OzTeX shareware on the Macintosh
  81. %--------------
  82. \def\PSspeci@l##1##2{%
  83. \special{##1 \space
  84.       ##2 1000 div dup scale
  85.       \number-\psllx\space \number-\pslly\space translate
  86. }}}%
  87. \def\psfordvitps{%       From the UNIX TeXPS package, vers.>3.12
  88. %---------------
  89. % Convert a dimension into the number \psn@sp (in scaled points)
  90. \def\psdimt@n@sp##1{\d@mx=##1\relax\edef\psn@sp{\number\d@mx}}
  91. \def\PSspeci@l##1##2{%
  92. % psfig.psr contains the def of "startTexFig": if you can locate it
  93. % and include the correct pathname, it should work
  94. \special{dvitps: Include0 "psfig.psr"}% contains def of "startTexFig"
  95. \psdimt@n@sp{\drawingwd}
  96. \special{dvitps: Literal "\psn@sp\space"}
  97. \psdimt@n@sp{\drawinght}
  98. \special{dvitps: Literal "\psn@sp\space"}
  99. \psdimt@n@sp{\psllx bp}
  100. \special{dvitps: Literal "\psn@sp\space"}
  101. \psdimt@n@sp{\pslly bp}
  102. \special{dvitps: Literal "\psn@sp\space"}
  103. \psdimt@n@sp{\psurx bp}
  104. \special{dvitps: Literal "\psn@sp\space"}
  105. \psdimt@n@sp{\psury bp}
  106. \special{dvitps: Literal "\psn@sp\space startTexFig\space"}
  107. \special{dvitps: Include1 "##1"}
  108. \special{dvitps: Literal "endTexFig\space"}
  109. }}%
  110. \def\psfordvialw{%   Try for dvialw, a UNIX public domain
  111. %---------------
  112. \def\PSspeci@l##1##2{
  113. \special{language "PostScript",
  114. position = "bottom left",
  115. literal "  \psllx\space \pslly\space translate
  116.   ##2 1000 div dup scale
  117.   -\psllx\space -\pslly\space translate",
  118. include "##1"}
  119. }}%
  120. \def\psforptips{%   For MS-DOS; LUOMA@brandeis.bitnet
  121. %---------------
  122. \def\PSspeci@l##1##2{{
  123. \d@mx=\psurx bp
  124. \advance \d@mx by -\psllx bp
  125. \divide \d@mx by 1000\multiply\d@mx by \xscale
  126. \incm{\d@mx}
  127. \let\tmpx\dimincm
  128. \d@my=\psury bp
  129. \advance \d@my by -\pslly bp
  130. \divide \d@my by 1000\multiply\d@my by \xscale
  131. \incm{\d@my}
  132. \let\tmpy\dimincm
  133. \d@mx=-\psllx bp
  134. \divide \d@mx by 1000\multiply\d@mx by \xscale
  135. \d@my=-\pslly bp
  136. \divide \d@my by 1000\multiply\d@my by \xscale
  137. \at(\d@mx;\d@my){\special{ps:##1 x=\tmpx, y=\tmpy}}
  138. }}}%
  139. \def\psonlyboxes{%     Draft-like behaviour if none of the others works
  140. %---------------
  141. \def\PSspeci@l##1##2{%
  142. \at(0cm;0cm){\boxit{\vbox to\drawinght
  143.   {\vss\hbox to\drawingwd{\at(0cm;0cm){\hbox{({\tt##1})}}\hss}}}}
  144. }}%
  145. \def\psloc@lerr#1{%
  146. \let\savedPSspeci@l=\PSspeci@l%
  147. \def\PSspeci@l##1##2{%
  148. \at(0cm;0cm){\boxit{\vbox to\drawinght
  149.   {\vss\hbox to\drawingwd{\at(0cm;0cm){\hbox{({\tt##1}) #1}}\hss}}}}
  150. \let\PSspeci@l=\savedPSspeci@l% restore normal output for other figs!
  151. }}%
  152. %\def\psfor...  add your own!
  153. %
  154. % Some common defs
  155. %
  156. \newread\pst@mpin
  157. \newdimen\drawinght\newdimen\drawingwd
  158. \newdimen\psxoffset\newdimen\psyoffset
  159. \newbox\drawingBox
  160. \newcount\xscale \newcount\yscale \newdimen\pscm\pscm=1cm
  161. \newdimen\d@mx \newdimen\d@my
  162. \newdimen\pswdincr \newdimen\pshtincr
  163. \let\ps@nnotation=\relax
  164. {\catcode`\|=0 |catcode`|\=12 |catcode`|%=12 |catcode`~=12
  165. |catcode`#=12 |catcode`*=14
  166. |xdef|backslashother{\}*
  167. |xdef|percentother{%}*
  168. |xdef|tildeother{~}*
  169. |xdef|sharpother{#}*
  170. }%
  171. % useful to display special chars in \tt; fails for \,#,%
  172. \def\R@moveMeaningHeader#1:->{}%
  173. \def\uncatcode#1{%
  174. \edef#1{\expandafter\R@moveMeaningHeader\meaning#1}}%
  175. %
  176. \def\execute#1{#1}% NOT stupid: cs in #1 are then identified BEFORE execution
  177. \def\psm@keother#1{\catcode`#112\relax}% borrowed from latex
  178. \def\executeinspecs#1{%
  179. \execute{\begingroup\let\do\psm@keother\dospecials\catcode`\^^M=9#1\endgroup}}%
  180. \def\@mpty{}%
  181. % \if\matchin#1#2<=> \iftrue if #1 contains #2, <=>\iffalse otherwise:
  182. % \if\matchexpin: idem, but #1 & #2 are first fully expanded (no \if
  183. % inside!)
  184. % \tmpa & \tmpb contain what's before and after the occurence of #2
  185. \def\matchexpin#1#2{
  186.   \fi%
  187. %\message{(#1>#2)}
  188.   \edef\tmpb{{#2}}%
  189.   \expandafter\makem@tchtmp\tmpb%
  190.   \edef\tmpa{#1}\edef\tmpb{#2}%
  191.   \expandafter\expandafter\expandafter\m@tchtmp\expandafter\tmpa\tmpb\endm@tch%
  192.   \if\match%
  193. }%
  194. \def\matchin#1#2{%
  195.   \fi%
  196.   \makem@tchtmp{#2}%
  197.   \m@tchtmp#1#2\endm@tch%
  198.   \if\match%
  199. }%
  200. \def\makem@tchtmp#1{\def\m@tchtmp##1#1##2\endm@tch{%
  201.   \def\tmpa{##1}\def\tmpb{##2}\let\m@tchtmp=\relax%
  202.   \ifx\tmpb\@mpty\def\match{YN}%
  203.   \else\def\match{YY}\fi%
  204. }}%
  205. % converts any dimen in cm, with 1E-4 cm precision
  206. \def\incm#1{{\psxoffset=1cm\d@my=#1
  207.  \d@mx=\d@my
  208.   \divide\d@mx by \psxoffset
  209.   \xdef\dimincm{\number\d@mx.}
  210.   \advance\d@my by -\number\d@mx cm
  211.   \multiply\d@my by 100
  212.  \d@mx=\d@my
  213.   \divide\d@mx by \psxoffset
  214.   \edef\dimincm{\dimincm\number\d@mx}
  215.   \advance\d@my by -\number\d@mx cm
  216.   \multiply\d@my by 100
  217.  \d@mx=\d@my
  218.   \divide\d@mx by \psxoffset
  219.   \xdef\dimincm{\dimincm\number\d@mx}
  220. }}%
  221. %
  222. %  \ReadPSize{PSfilename} reads the dimensions of a PostScript drawing
  223. %      and stores it in \drawinght(wd)
  224. \newif\ifNotB@undingBox
  225. \newhelp\PShelp{Proceed: you'll have a 5cm square blank box instead of
  226. your graphics (Jean Orloff).}%
  227. \def\s@tsize#1 #2 #3 #4\@ndsize{
  228.   \def\psllx{#1}\def\pslly{#2}%
  229.   \def\psurx{#3}\def\psury{#4}%  needed by a crazyness of dvips!
  230.   \ifx\psurx\@mpty\NotB@undingBoxtrue% this is not a valid one!
  231.   \else
  232.     \drawinght=#4bp\advance\drawinght by-#2bp
  233.     \drawingwd=#3bp\advance\drawingwd by-#1bp
  234. %  !Units related by crazy factors as bp/pt=72.27/72 should be BANNED!
  235.   \fi
  236.   }%
  237. \def\sc@nBBline#1:#2\@ndBBline{\edef\p@rameter{#1}\edef\v@lue{#2}}%
  238. \def\g@bblefirstblank#1#2:{\ifx#1 \else#1\fi#2}%
  239. {\catcode`\%=12
  240. \xdef\B@undingBox{%%BoundingBox}}%
  241. %% is not a true comment in PostScript, even if % is!
  242. \def\ReadPSize#1{
  243.  \readfilename#1\relax
  244.  \let\PSfilename=\lastreadfilename
  245.  \openin\pst@mpin=#1\relax
  246.  \ifeof\pst@mpin \errhelp=\PShelp
  247.    \errmessage{I haven't found your postscript file (\PSfilename)}%
  248.    \psloc@lerr{was not found}%
  249.    \s@tsize 0 0 142 142\@ndsize
  250.    \closein\pst@mpin
  251.  \else
  252. % each entry in \GlobalInputList should be unique
  253.    \if\matchexpin{\GlobalInputList}{, \lastreadfilename}%
  254.    \else\xdef\GlobalInputList{\GlobalInputList, \lastreadfilename}%
  255.      \immediate\write\psbj@inaux{\lastreadfilename,}%
  256.    \fi%
  257.    \loop
  258.      \executeinspecs{\catcode`\ =10\global\read\pst@mpin to\n@xtline}%
  259.      \ifeof\pst@mpin
  260.        \errhelp=\PShelp
  261.        \errmessage{(\PSfilename) is not an Encapsulated PostScript File:
  262.            I could not find any \B@undingBox: line.}%
  263.        \edef\v@lue{0 0 142 142:}%
  264.        \psloc@lerr{is not an EPSFile}%
  265.        \NotB@undingBoxfalse
  266.      \else
  267.        \expandafter\sc@nBBline\n@xtline:\@ndBBline
  268.        \ifx\p@rameter\B@undingBox\NotB@undingBoxfalse
  269.          \edef\t@mp{%
  270.            \expandafter\g@bblefirstblank\v@lue\space\space\space}%
  271.          \expandafter\s@tsize\t@mp\@ndsize
  272.        \else\NotB@undingBoxtrue
  273.        \fi
  274.      \fi
  275.    \ifNotB@undingBox\repeat
  276.    \closein\pst@mpin
  277.  \fi
  278. \message{#1}%
  279. }%
  280. %
  281. % \psboxto(xdim;ydim){psfilename}: you specify the dimensions and
  282. %    TeX uniformly scales to fit the largest one. If xdim=0pt, the
  283. %    scale is fully determined by ydim and vice versa.
  284. %    Notice: psboxes are a real vboxes; couldn't take hbox otherwise all
  285. %    indentation and all cr's would be interpreted as spaces (hugh!).
  286. %
  287. \def\psboxto(#1;#2)#3{\vbox{%
  288.    \ReadPSize{#3}%
  289.    \advance\pswdincr by \drawingwd
  290.    \advance\pshtincr by \drawinght
  291.    \divide\pswdincr by 1000
  292.    \divide\pshtincr by 1000
  293.    \d@mx=#1
  294.    \ifdim\d@mx=0pt\xscale=1000
  295.          \else \xscale=\d@mx \divide \xscale by \pswdincr\fi
  296.    \d@my=#2
  297.    \ifdim\d@my=0pt\yscale=1000
  298.          \else \yscale=\d@my \divide \yscale by \pshtincr\fi
  299.    \ifnum\yscale=1000
  300.          \else\ifnum\xscale=1000\xscale=\yscale
  301.                     \else\ifnum\yscale<\xscale\xscale=\yscale\fi
  302.               \fi
  303.    \fi
  304.    \divide\drawingwd by1000 \multiply\drawingwd by\xscale
  305.    \divide\drawinght by1000 \multiply\drawinght by\xscale
  306.    \divide\psxoffset by1000 \multiply\psxoffset by\xscale
  307.    \divide\psyoffset by1000 \multiply\psyoffset by\xscale
  308.    \global\divide\pscm by 1000
  309.    \global\multiply\pscm by\xscale
  310.    \multiply\pswdincr by\xscale \multiply\pshtincr by\xscale
  311.    \ifdim\d@mx=0pt\d@mx=\pswdincr\fi
  312.    \ifdim\d@my=0pt\d@my=\pshtincr\fi
  313.    \message{scaled \the\xscale}%
  314.  \hbox to\d@mx{\hss\vbox to\d@my{\vss
  315.    \global\setbox\drawingBox=\hbox to 0pt{\kern\psxoffset\vbox to 0pt{%
  316.       \kern-\psyoffset
  317.       \PSspeci@l{\PSfilename}{\the\xscale}%
  318.       \vss}\hss\ps@nnotation}%
  319.    \global\wd\drawingBox=\the\pswdincr
  320.    \global\ht\drawingBox=\the\pshtincr
  321.    \global\drawingwd=\pswdincr
  322.    \global\drawinght=\pshtincr
  323.    \baselineskip=0pt
  324.    \copy\drawingBox
  325.  \vss}\hss}%
  326.   \global\psxoffset=0pt
  327.   \global\psyoffset=0pt
  328.   \global\pswdincr=0pt
  329.   \global\pshtincr=0pt % These are local to one figure
  330.   \global\pscm=1cm %should not be necessary
  331. }}%
  332. %
  333. % \psboxscaled{scalefactor*1000}{PSfilename} allows to bypass the
  334. %   rounding errors of TeX integer divisions for situations where the
  335. %   TeX box should fit the original BoundingBox with a precision
  336. %   better
  337. %   than 1/1000.
  338. %
  339. \def\psboxscaled#1#2{\vbox{%
  340.   \ReadPSize{#2}%
  341.   \xscale=#1
  342.   \message{scaled \the\xscale}%
  343.   \divide\pswdincr by 1000 \multiply\pswdincr by \xscale
  344.   \divide\pshtincr by 1000 \multiply\pshtincr by \xscale
  345.   \divide\psxoffset by1000 \multiply\psxoffset by\xscale
  346.   \divide\psyoffset by1000 \multiply\psyoffset by\xscale
  347.   \divide\drawingwd by1000 \multiply\drawingwd by\xscale
  348.   \divide\drawinght by1000 \multiply\drawinght by\xscale
  349.   \global\divide\pscm by 1000
  350.   \global\multiply\pscm by\xscale
  351.   \global\setbox\drawingBox=\hbox to 0pt{\kern\psxoffset\vbox to 0pt{%
  352.      \kern-\psyoffset
  353.      \PSspeci@l{\PSfilename}{\the\xscale}%
  354.      \vss}\hss\ps@nnotation}%
  355.   \advance\pswdincr by \drawingwd
  356.   \advance\pshtincr by \drawinght
  357.   \global\wd\drawingBox=\the\pswdincr
  358.   \global\ht\drawingBox=\the\pshtincr
  359.   \global\drawingwd=\pswdincr
  360.   \global\drawinght=\pshtincr
  361.   \baselineskip=0pt
  362.   \copy\drawingBox
  363.   \global\psxoffset=0pt
  364.   \global\psyoffset=0pt
  365.   \global\pswdincr=0pt
  366.   \global\pshtincr=0pt % These are local to one figure
  367.   \global\pscm=1cm
  368. }}%
  369. %
  370. %  \psbox{PSfilename} makes a TeX box having the minimal size to
  371. %      enclose the picture
  372. \def\psbox#1{\psboxscaled{1000}{#1}}%
  373. %------------------------------------------------------
  374. %  \joinfiles file1, file2, ...n \into joinedfilename .
  375. %     makes one file out of many
  376. %  \splitfile joinedfilename
  377. %     the opposite
  378. \newif\ifn@teof\n@teoftrue
  379. \newif\ifc@ntrolline
  380. \newif\ifmatch
  381. \newread\j@insplitin
  382. \newwrite\j@insplitout
  383. \newwrite\psbj@inaux
  384. \immediate\openout\psbj@inaux=psbjoin.aux
  385. \immediate\write\psbj@inaux{\string\joinfiles}%
  386. \immediate\write\psbj@inaux{\jobname,}%
  387. %
  388. % INPUT REDEFINITION
  389. %
  390. % works if #1 is a single character
  391. \def\toother#1{\ifcat\relax#1\else\expandafter%
  392.   \toother@ux\meaning#1\endtoother@ux\fi}%
  393. \def\toother@ux#1 #2#3\endtoother@ux{\def\tmp{#3}%
  394.   \ifx\tmp\@mpty\def\tmp{#2}\let\next=\relax%
  395.   \else\def\next{\toother@ux#2#3\endtoother@ux}\fi%
  396. \next}%
  397. %
  398. % \readfilename defs:
  399. %
  400. \let\readfilenamehook=\relax
  401. \def\re@d{\expandafter\re@daux}% spares typing 10 \expandafter's...
  402. \def\re@daux{\futurelet\nextchar\stopre@dtest}%
  403. \def\re@dnext{\xdef\lastreadfilename{\lastreadfilename\nextchar}%
  404.   \afterassignment\re@d\let\nextchar}%
  405. \def\stopre@d{\egroup\readfilenamehook}%
  406. \def\stopre@dtest{%
  407.   \ifcat\nextchar\relax\let\nextread\stopre@d
  408.   \else
  409.     \ifcat\nextchar\space\def\nextread{%
  410.       \afterassignment\stopre@d\chardef\nextchar=`}%
  411.     \else\let\nextread=\re@dnext
  412.       \toother\nextchar
  413.       \edef\nextchar{\tmp}%
  414.     \fi
  415.   \fi\nextread}%
  416. \def\readfilename{\bgroup%
  417.   \let\\=\backslashother \let\%=\percentother \let\~=\tildeother
  418.   \let\#=\sharpother \xdef\lastreadfilename{}%
  419.   \re@d}%
  420. %
  421. % redefines \input using \readfilename
  422. %
  423. \xdef\GlobalInputList{\jobname}%
  424. \def\psnewinput{%
  425.   \def\readfilenamehook{% each entry in \GlobalInputList should be unique
  426.     \if\matchexpin{\GlobalInputList}{, \lastreadfilename}%
  427.     \else\xdef\GlobalInputList{\GlobalInputList, \lastreadfilename}%
  428.       \immediate\write\psbj@inaux{\lastreadfilename,}%
  429.     \fi%
  430.     \ps@ldinput\lastreadfilename\relax%
  431.     \let\readfilenamehook=\relax%
  432.   }\readfilename%
  433. }%
  434. \expandafter\ifx\csname @@input\endcsname\relax    % then Plain
  435.   \immediate\let\ps@ldinput=\input\def\input{\psnewinput}%
  436. \else
  437.   \immediate\let\ps@ldinput=\@@input
  438.   \def\@@input{\psnewinput}%
  439. \fi%
  440. %
  441. \def\nowarnopenout{%
  442.  \def\warnopenout##1##2{%
  443.    \readfilename##2\relax
  444.    \message{\lastreadfilename}%
  445.    \immediate\openout##1=\lastreadfilename\relax}}%
  446. \def\warnopenout#1#2{%
  447.  \readfilename#2\relax
  448.  \def\t@mp{TrashMe,psbjoin.aux,psbjoint.tex,}\uncatcode\t@mp
  449.  \if\matchexpin{\t@mp}{\lastreadfilename,}%
  450.  \else
  451.    \immediate\openin\pst@mpin=\lastreadfilename\relax
  452.    \ifeof\pst@mpin
  453.      \else
  454.      \errhelp{If the content of this file is so precious to you, abort (ie
  455. press x or e) and rename it before retrying.}%
  456.      \errmessage{I'm just about to replace your file named \lastreadfilename}%
  457.    \fi
  458.    \immediate\closein\pst@mpin
  459.  \fi
  460.  \message{\lastreadfilename}%
  461.  \immediate\openout#1=\lastreadfilename\relax}%
  462. % % will have an unusual catcode below; use * instead
  463. %\vbox
  464. {\catcode`\%=12\catcode`\*=14
  465. \gdef\splitfile#1{*
  466.  \readfilename#1\relax
  467.  \immediate\openin\j@insplitin=\lastreadfilename\relax
  468.  \ifeof\j@insplitin
  469.    \message{! I couldn't find and split \lastreadfilename!}*
  470.  \else
  471.    \immediate\openout\j@insplitout=TrashMe
  472.    \message{< Splitting \lastreadfilename\space into}*
  473.    \loop
  474.      \ifeof\j@insplitin
  475.        \immediate\closein\j@insplitin\n@teoffalse
  476.      \else
  477.        \n@teoftrue
  478.        \executeinspecs{\global\read\j@insplitin to\spl@tinline\expandafter
  479.          \ch@ckbeginnewfile\spl@tinline%Beginning-Of-File-Named:%\endcheck}*
  480.        \ifc@ntrolline
  481.        \else
  482.          \toks0=\expandafter{\spl@tinline}*
  483.          \immediate\write\j@insplitout{\the\toks0}*
  484.        \fi
  485.      \fi
  486.    \ifn@teof\repeat
  487.    \immediate\closeout\j@insplitout
  488.  \fi\message{>}*
  489. }*
  490. \gdef\ch@ckbeginnewfile#1%Beginning-Of-File-Named:#2%#3\endcheck{*
  491.  \def\t@mp{#1}*
  492.  \ifx\@mpty\t@mp
  493.    \def\t@mp{#3}*
  494.    \ifx\@mpty\t@mp
  495.      \global\c@ntrollinefalse
  496.    \else
  497.      \immediate\closeout\j@insplitout
  498.      \warnopenout\j@insplitout{#2}*
  499.      \global\c@ntrollinetrue
  500.    \fi
  501.  \else
  502.    \global\c@ntrollinefalse
  503.  \fi}*
  504. \gdef\joinfiles#1\into#2{*
  505.  \message{< Joining following files into}*
  506.  \warnopenout\j@insplitout{#2}*
  507.  \message{:}*
  508.  {*
  509.  \edef\w@##1{\immediate\write\j@insplitout{##1}}*
  510. \w@{% This collection of files was produced with CERN psbox package}*
  511. \w@{% To decompose and tex it:}*
  512. \w@{%-save this with a filename CONTAINING ONLY LETTERS and a .TEX}*
  513. \w@{% extension (say, JOINTFIL.TEX), in some uncrowded directory;}*
  514. \w@{%-make sure you can \string\input\space psbox.tex (version>=1.3);}*
  515. \w@{%  (else ftp cs.nyu.edu(=128.122.140.24):pub/TeX/psbox/, then get}*
  516. \w@{%  and tex the file psboxall.tex; more info in psbREAD.ME)}*
  517. \w@{%-tex JOINTFIL.TEX using Plain, or LaTeX, or whatever is needed by}*
  518. \w@{%  the first file in the joining (after splitting JOINTFIL.TEX into}*
  519. \w@{%  it's constituents, TeX will try to process it as it stands).}*
  520. \w@{\string\input\space psbox.tex}*
  521. \w@{\string\splitfile{\string\jobname}}*
  522. \w@{\string\let\string\autojoin=\string\relax}*
  523. }*
  524.  \expandafter\tre@tfilelist#1, \endtre@t
  525.  \immediate\closeout\j@insplitout
  526.  \message{>}*
  527. }*
  528. \gdef\tre@tfilelist#1, #2\endtre@t{*
  529.  \readfilename#1\relax
  530.  \ifx\@mpty\lastreadfilename
  531.  \else
  532.    \immediate\openin\j@insplitin=\lastreadfilename\relax
  533.    \ifeof\j@insplitin
  534.      \errmessage{I couldn't find file \lastreadfilename}*
  535.    \else
  536.      \message{\lastreadfilename}*
  537.      \immediate\write\j@insplitout{%Beginning-Of-File-Named:\lastreadfilename}*
  538.      \executeinspecs{\global\read\j@insplitin to\oldj@ininline}*
  539.      \loop
  540.        \ifeof\j@insplitin\immediate\closein\j@insplitin\n@teoffalse
  541.        \else\n@teoftrue
  542.          \executeinspecs{\global\read\j@insplitin to\j@ininline}*
  543.          \toks0=\expandafter{\oldj@ininline}*
  544.          \let\oldj@ininline=\j@ininline
  545.          \immediate\write\j@insplitout{\the\toks0}*
  546.        \fi
  547.      \ifn@teof
  548.      \repeat
  549.    \immediate\closein\j@insplitin
  550.    \fi
  551.    \tre@tfilelist#2, \endtre@t
  552.  \fi}*
  553. }%
  554. % To be put at the end of a file, for making a tar-like file containing
  555. %   everything it used.
  556. \def\autojoin{%
  557.  \immediate\write\psbj@inaux{\string\into{psbjoint.tex}}%
  558.  \immediate\closeout\psbj@inaux
  559.  \expandafter\joinfiles\GlobalInputList\into{psbjoint.tex}%
  560. }%
  561. %----------------------------------------------------------------
  562. %  Annotations & Captions etc...
  563. %
  564. %
  565. % \centinsert{anybox} is just a centered \midinsert, but is included as
  566. %    people barely use the original inserts from TeX.
  567. %
  568. \def\centinsert#1{\midinsert\line{\hss#1\hss}\endinsert}%
  569. \def\psannotate#1#2{\vbox{%
  570.   \def\ps@nnotation{#2\global\let\ps@nnotation=\relax}#1}}%
  571. \def\pscaption#1#2{\vbox{%
  572.    \setbox\drawingBox=#1
  573.    \copy\drawingBox
  574.    \vskip\baselineskip
  575.    \vbox{\hsize=\wd\drawingBox\setbox0=\hbox{#2}%
  576.      \ifdim\wd0>\hsize
  577.        \noindent\unhbox0\tolerance=5000
  578.     \else\centerline{\box0}%
  579.     \fi
  580. }}}%
  581. % for compatibility with older versions, but \psfig is a bad name!
  582. %\def\psfig#1#2#3{\pscaption{\psannotate{#1}{#2}}{#3}}
  583. %\def\psfigurebox#1#2#3{\pscaption{\psannotate{\psbox{#1}}{#2}}{#3}}
  584. %
  585. % \at(#1;#2)#3 puts #3 at #1-higher and #2-right of the current
  586. %    position without moving it (to be used in annotations).
  587. \def\at(#1;#2)#3{\setbox0=\hbox{#3}\ht0=0pt\dp0=0pt
  588.   \rlap{\kern#1\vbox to0pt{\kern-#2\box0\vss}}}%
  589. %
  590. % \gridfill(ht;wd) makes a 1cm*1cm grid of ht by wd whose lower-left
  591. %   corner is the current point
  592. \newdimen\gridht \newdimen\gridwd
  593. \def\gridfill(#1;#2){%
  594.   \setbox0=\hbox to 1\pscm
  595.   {\vrule height1\pscm width.4pt\leaders\hrule\hfill}%
  596.   \gridht=#1
  597.   \divide\gridht by \ht0
  598.   \multiply\gridht by \ht0
  599.   \gridwd=#2
  600.   \divide\gridwd by \wd0
  601.   \multiply\gridwd by \wd0
  602.   \advance \gridwd by \wd0
  603.   \vbox to \gridht{\leaders\hbox to\gridwd{\leaders\box0\hfill}\vfill}}%
  604. %
  605. % Useful to measure where to put annotations
  606. \def\fillinggrid{\at(0cm;0cm){\vbox{%
  607.   \gridfill(\drawinght;\drawingwd)}}}%
  608. %
  609. % \textleftof\anybox: Sample text\endtext
  610. %   inserts "Sample text" on the left of \anybox ie \vbox, \psbox.
  611. %   \textrightof is the symmetric (not documented, too uggly)
  612. % Welcome any suggestion about clean wraparound macros from
  613. %   TeXhackers reading this
  614. %
  615. \def\textleftof#1:{%
  616.   \setbox1=#1
  617.   \setbox0=\vbox\bgroup
  618.     \advance\hsize by -\wd1 \advance\hsize by -2em}%
  619. \def\textrightof#1:{%
  620.   \setbox0=#1
  621.   \setbox1=\vbox\bgroup
  622.     \advance\hsize by -\wd0 \advance\hsize by -2em}%
  623. \def\endtext{%
  624.   \egroup
  625.   \hbox to \hsize{\valign{\vfil##\vfil\cr%
  626. \box0\cr%
  627. \noalign{\hss}\box1\cr}}}%
  628. %
  629. % \frameit{\thick}{\skip}{\anybox}
  630. %    draws with thickness \thick a box around \anybox, leaving \skip of
  631. %    blank around it. eg \frameit{0.5pt}{1pt}{\hbox{hello}}
  632. % \boxit{\anybox} is a shortcut.
  633. \def\frameit#1#2#3{\hbox{\vrule width#1\vbox{%
  634.   \hrule height#1\vskip#2\hbox{\hskip#2\vbox{#3}\hskip#2}%
  635.         \vskip#2\hrule height#1}\vrule width#1}}%
  636. \def\boxit#1{\frameit{0.4pt}{0pt}{#1}}%
  637. %
  638. %
  639. \catcode`\@=12 % cs containing @ are unreachable
  640. %
  641. % CUSTOMIZE YOUR DEFAULT DRIVER:
  642. %    Uncomment the line corresponding to your TeX system:
  643. %\psfortextures%     For TeXtures on the Macintosh
  644. %\psforoztex   %     For OzTeX shareware on the Macintosh
  645. %\psfordvitops %     For the DVItoPS converter for TeX on IBM mainframes
  646.  \psfordvips   %     For DVIPS converter on VAX and UNIX
  647. %\psfordvitps  %     For dvitps from TeXPS package under UNIX
  648. %\psfordvialw  %     For dvialw, UNIX public domain
  649. %\psonlyboxes  %     Blank Boxes (when all else fails).
  650.